#include "JProjectWidget.h"

#include <QHeaderView>
#include <QMenu>
#include <QFileInfo>
#include <QMessageBox>
#include <QTextStream>

JProjectWidget::JProjectWidget(QWidget *parent)
	: QTreeWidget(parent)
{
	//setHeaderHidden(true);
	setMouseTracking(true);
	//setFrameShape(QFrame::NoFrame);
	//setFrameShadow(QFrame::Plain);
	setAlternatingRowColors(true);
	setAnimated(true);
	setIndentation(12);
	setRootIsDecorated(false);

	QStringList labels;
	labels << tr("Title") << tr("Location");

	header()->setResizeMode(QHeaderView::Stretch);
	setHeaderLabels(labels);

	/*QTreeWidgetItem *headeritem = headerItem();
	headeritem->setText(1, tr("Location"));
	headeritem->setText(0, tr("File"));
	header()->setResizeMode(1,QHeaderView::Stretch);
	header()->setResizeMode(0,QHeaderView::ResizeToContents);*/

	setCurrentProject("testoutput");

	setContextMenuPolicy(Qt::CustomContextMenu);
	connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(contextMenu(const QPoint &)) );
}

JProjectWidget::~JProjectWidget()
{

}

void JProjectWidget::setCurrentProject(const QString& name)
{
	// remove all items from current project
	clear();

	// set new current project
	m_CurrentProjectName = name;
	m_CurrentProjectName.resize(m_CurrentProjectName.size()-4);
	m_pRoot = new QTreeWidgetItem();
	QFont font;
	font.setBold(true);
	m_pRoot->setText(0,m_CurrentProjectName);
	m_pRoot->setFont(0,font);
	m_pRoot->setFlags(Qt::ItemIsDragEnabled|Qt::ItemIsEnabled);
	//m_pRoot->setIcon(0,);

	addTopLevelItem(m_pRoot);
	updateDomElement(m_pRoot,0);
}

QString JProjectWidget::strippedName( const QString &fullFileName )
{
	return QFileInfo(fullFileName).fileName();
}

bool JProjectWidget::restoreFromFile( const QString& filename )
{
	setCurrentProject(strippedName(filename));
	// restore the contents here

	return true;
}

bool JProjectWidget::saveToFile( const QString& filename )
{
	// export to file here
	return true;
}

void JProjectWidget::contextMenu( const QPoint &pt )
{
	QMenu *ctxMenu = new QMenu;
	ctxMenu->addAction(tr( "Add Model" ), this, SLOT( loadModel()) );
	//QMenu *menu = new QMenu("Add",ctxMenu);
	//ctxMenu->addAction(menu->menuAction());
	//menu->addAction(tr( "Model" ), this, SLOT( loadModel() ));
	//menu->addAction(tr( "Kin" ), this, SLOT( actionView2() ));
	ctxMenu->addSeparator();
	ctxMenu->addAction(tr("Add Kinematics "), this, SLOT( loadKinematics()) );

	ctxMenu->exec(this->mapToGlobal(pt));
}

void JProjectWidget::loadModel()
{

}

void JProjectWidget::loadKinematics()
{

}

bool JProjectWidget::read( QIODevice *device )
{
	QString errorStr;
	int errorLine;
	int errorColumn;

	if (!domDocument.setContent(device, true, &errorStr, &errorLine,
		&errorColumn)) {
			QMessageBox::information(window(), tr("DOM Bookmarks"),
				tr("Parse error at line %1, column %2:\n%3")
				.arg(errorLine)
				.arg(errorColumn)
				.arg(errorStr));
			return false;
	}

	QDomElement root = domDocument.documentElement();
	if (root.tagName() != "xbel") {
		QMessageBox::information(window(), tr("DOM Bookmarks"),
			tr("The file is not an XBEL file."));
		return false;
	} else if (root.hasAttribute("version")
		&& root.attribute("version") != "1.0") {
			QMessageBox::information(window(), tr("DOM Bookmarks"),
				tr("The file is not an XBEL version 1.0 "
				"file."));
			return false;
	}

	clear();

	disconnect(this, SIGNAL(itemChanged(QTreeWidgetItem*,int)),
		this, SLOT(updateDomElement(QTreeWidgetItem*,int)));

	QDomElement child = root.firstChildElement("folder");
	while (!child.isNull()) {
		parseFolderElement(child);
		child = child.nextSiblingElement("folder");
	}

	connect(this, SIGNAL(itemChanged(QTreeWidgetItem*,int)),
		this, SLOT(updateDomElement(QTreeWidgetItem*,int)));

	return true;
}

bool JProjectWidget::write( QIODevice *device )
{
	const int IndentSize = 4;

	QTextStream out(device);
	domDocument.save(out, IndentSize);
	return true;
}

void JProjectWidget::updateDomElement( QTreeWidgetItem *item, int column )
{
	QDomElement element = domElementForItem.value(item);
	if (!element.isNull()) {
		if (column == 0) {
			QDomElement oldTitleElement = element.firstChildElement("title");
			QDomElement newTitleElement = domDocument.createElement("title");

			QDomText newTitleText = domDocument.createTextNode(item->text(0));
			newTitleElement.appendChild(newTitleText);

			element.replaceChild(newTitleElement, oldTitleElement);
		} else {
			if (element.tagName() == "bookmark")
				element.setAttribute("href", item->text(1));
		}
	}
}

void JProjectWidget::parseFolderElement( const QDomElement &element, QTreeWidgetItem *parentItem /*= 0*/ )
{
	QTreeWidgetItem *item = createItem(element, parentItem);

	QString title = element.firstChildElement("title").text();
	if (title.isEmpty())
		title = QObject::tr("Folder");

	item->setFlags(item->flags() | Qt::ItemIsEditable);
	//item->setIcon(0, folderIcon);
	item->setText(0, title);

	bool folded = (element.attribute("folded") != "no");
	setItemExpanded(item, !folded);

	QDomElement child = element.firstChildElement();
	while (!child.isNull()) {
		if (child.tagName() == "folder") {
			parseFolderElement(child, item);
		} else if (child.tagName() == "bookmark") {
			QTreeWidgetItem *childItem = createItem(child, item);

			QString title = child.firstChildElement("title").text();
			if (title.isEmpty())
				title = QObject::tr("Folder");

			childItem->setFlags(item->flags() | Qt::ItemIsEditable);
			//childItem->setIcon(0, bookmarkIcon);
			childItem->setText(0, title);
			childItem->setText(1, child.attribute("href"));
		} else if (child.tagName() == "separator") {
			QTreeWidgetItem *childItem = createItem(child, item);
			childItem->setFlags(item->flags() & ~(Qt::ItemIsSelectable | Qt::ItemIsEditable));
			childItem->setText(0, QString(30, 0xB7));
		}
		child = child.nextSiblingElement();
	}
}

QTreeWidgetItem * JProjectWidget::createItem( const QDomElement &element, QTreeWidgetItem *parentItem /*= 0*/ )
{
	QTreeWidgetItem *item;
	if (parentItem) {
		item = new QTreeWidgetItem(parentItem);
	} else {
		item = new QTreeWidgetItem(this);
	}
	domElementForItem.insert(item, element);
	return item;
}